package com.dys.teststreamapi11;

import com.dys.testlambda02.entity.Person;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @className: com.dys.teststreamapi11.StreamAPITest
 * @description: 对流中数据做分组操作
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/01 下午4:39
 */
public class StreamAPITest12 {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        streamToManyGroup();
    }

    /**
     * 分组计算
     */
    private static void streamToGroupBy() {
        // 对名称进行分组
        Map<String, List<Person>> map1 = Stream.of(
                new Person("张三", 18),
                new Person("李四", 32),
                new Person("李思思", 13),
                new Person("张三", 20)).collect(Collectors.groupingBy(Person::getName));
        map1.forEach((k, v) -> {
            System.out.println("k=" + k + ",v=" + v);
        });

        // 根据年龄进行分组，若年龄>=18 成年,否则未成年
        System.out.println("--------------------------------");
        Map<String, List<Person>> map2 = Stream.of(
                new Person("张三", 18),
                new Person("李四", 32),
                new Person("李思思", 13),
                new Person("张三", 20)).collect(Collectors.groupingBy(p -> p.getAge() >= 18 ? "成年" : "未成年"));
        map2.forEach((k, v) -> {
            System.out.println("k=" + k + ",v=" + v);
        });
    }

    /**
     * 多级分组
     */
    private static void streamToManyGroup() {
        // 先根据name分组，然后根据age(成年和未成年)分组
        Map<String, Map<String, List<Person>>> map1 = Stream.of(
                new Person("张三", 18),
                new Person("李四", 32),
                new Person("李思思", 13),
                new Person("张三", 20)).collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(p -> p.getAge() >= 18 ? "成年" : "未成年")));
        map1.forEach((k, v) -> {
            System.out.println(k);
            v.forEach((k1, v1) -> {
                System.out.println("\tk1=" + k1 + ",v1=" + v1);
            });
        });
    }
}
